package cn.rht.study.controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.rht.study.service.ex.OtherException;
import cn.rht.study.util.*;
import cn.rht.study.util.redis.JedisUtil;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import cn.rht.study.controller.ex.FileOutException;
import cn.rht.study.entity.User;
import cn.rht.study.service.IUserService;

@RestController
@RequestMapping("user")
public class UserController extends BaseController {

    @Autowired
    IUserService iUserService;
    @Autowired
    private JedisUtil jedisUtil;

    @PostMapping("submit")
    public JsonResult<Void> addUser(User user) {
        log.info("################################################################");
        log.info("###                     添加修改用户                     ###");
        log.info("################################################################");
        log.info("获取用户信息=" + user);
        iUserService.createUser(user);
        return new JsonResult<Void>(SUCCESS);
    }

    @PostMapping("login")
    public JsonResult<User> login(String username, String password) {
        log.info("################################################################");
        log.info("###                     登录                     ###");
        log.info("################################################################");
        log.info("username=" + username + ",password=" + password);
        User user = iUserService.Login(username, password);
        return new JsonResult<User>(SUCCESS, user);
    }

    @GetMapping("deatil/{id}")
    public JsonResult<User> userdeatil(@PathVariable("id") Integer id) {
        log.info("################################################################");
        log.info("###                     获取用户信息详情                     ###");
        log.info("################################################################");
        User user = iUserService.findUserById(id);
        return new JsonResult<User>(SUCCESS, user);
    }

    @GetMapping("userlist")
    public JsonResult<List<User>> userList() {
        log.info("################################################################");
        log.info("###                     获取所有用户列表                     ###");
        log.info("################################################################");
        List<User> list = iUserService.getUserList();
        return new JsonResult<List<User>>(SUCCESS, list);
    }

    @PostMapping("delete/{id}")
    public JsonResult<Void> delete(@PathVariable("id") Integer id) {
        log.info("################################################################");
        log.info("###                     删除用户                     ###");
        log.info("################################################################");
        log.info("id=" + id);
        iUserService.clean(id);
        return new JsonResult<Void>(SUCCESS);
    }

    @PostMapping("/import")
    public JsonResult<Integer> importFile(@RequestBody List<User> list) {
        log.info("################################################################");
        log.info("###                     导入用户表                  ###");
        log.info("################################################################");
        log.info("用户表信息=" + list);
        Integer row = iUserService.createUsers(list);
        return new JsonResult<Integer>(SUCCESS, row);
    }

    @PostMapping("import/preview")
    public JsonResult<List<User>> importPreview(@RequestPart("file") MultipartFile file) {
        log.info("################################################################");
        log.info("###                      导入用户预览                       ###");
        log.info("################################################################");
        log.info("originalFilename=" + file.getOriginalFilename() + ", size=" + file.getSize() + ", contentType=" + file.getContentType());
        try {
            List<User> list = PoiUtils.parseFileList(file);
            log.info("用户表信息=" + list);
            return new JsonResult<List<User>>(SUCCESS, list);
        } catch (IOException e) {
            throw new FileOutException("导入excel异常");
        }
    }

    @PostMapping("exportExcel")
    public void exportExcel(HttpServletResponse response) {
        log.info("################################################################");
        log.info("###                      导出用户信息                      ###");
        log.info("################################################################");
        List<User> list = iUserService.getUserList();
        try {
            PoiUtils.exportUserExcel(list, response);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @GetMapping("fuzzyQuery/{name}")
    public JsonResult<List<User>> fuzzyQuery(@PathVariable("name") String username) {
        log.info("################################################################");
        log.info("###                      模糊查询用户信息                      ###");
        log.info("################################################################");
        log.info("参数为username={}", username);
        List<User> list = iUserService.queryUser(username);
        return new JsonResult<List<User>>(SUCCESS, list);
    }

    @PostMapping("uploadImg")
    public JsonResult<String> uploadPicture(@RequestParam(value = "file", required = false) MultipartFile file, HttpServletRequest request, Integer id) {
        log.info("################################################################");
        log.info("###                      开始上传头像                      ###");
        log.info("################################################################");
        String avatar = null;
        avatar = UploadUtils.uploadImg(file, request);
        return new JsonResult<>(SUCCESS, avatar);
    }

    @PostMapping("change")
    public JsonResult<Void> change(User user, String date) {
        log.info("################################################################");
        log.info("###                      开始修改信息                      ###");
        log.info("################################################################");
        log.info("参数user={},date={}", user, date);
        iUserService.changeInfo(user,date);
        return new JsonResult<Void>();
    }


    @PostMapping("upload")
    public JsonResult<String> upload(@RequestParam(value = "file", required = false) MultipartFile file) throws IOException {
        log.info("################################################################");
        log.info("###                      开始上传文件                      ###");
        log.info("################################################################");
        String avatar = null;
        avatar = UploadUtils.upload(file);
        return new JsonResult<>(SUCCESS, avatar);
    }

    @PostMapping("sendSms")
    public JsonResult<String> sendSms(String phone){
        log.info("################################################################");
        log.info("###                      发送验证码                      ###");
        log.info("################################################################");

        String code = RandomUtils.getRandomNumberString(6);
        SendSmsResponse sendSmsResponse = SmsUtil.sendSms(phone,code,"");
        if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
            // 请求成功
            jedisUtil.set("SMS:"+phone,code,5*60*1000);//验证码5分钟过期
            return new JsonResult<>(SUCCESS);
        } else if (sendSmsResponse.getCode().equals("isv.BUSINESS_LIMIT_CONTROL")) {
            throw new OtherException("短信发送失败");
        }
        return new JsonResult<>(SUCCESS);
    }

    @PostMapping("register")
    public JsonResult<String> register(User user, String code){
        log.info("################################################################");
        log.info("###                      注册账号                      ###");
        log.info("################################################################");

        String codeNum = jedisUtil.getByKey("SMS:"+user.getUsername());
        if(!code.equals(codeNum)){
            throw new OtherException("验证码错误");
        }
        iUserService.createPhone(user);
        return new JsonResult<>(SUCCESS);
    }
}
